// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database()

const authCollection = db.collection('role')

const permissionCollection = db.collection('permission')

const userRoleCollection = db.collection('user-role')

const TcbRouter = require('tcb-router')

const _ = db.command

const $ = db.command.aggregate

// 云函数入口函数
exports.main = async (event, context) => {
  const app = new TcbRouter({
    event
  })

  // 权限添加
  app.router('permisssionAdd', async (ctx, next) => {
    const permissions = event.permissions
    ctx.body = await permissionCollection.add({
      data: {
        ...permissions,
        createTime: db.serverDate()
      }
    }).then((res) => {
      console.log('插入权限成功')
    }).catch((err) => {
      console.error('插入权限失败')
    })
  })

  // B1 权限列表查询
  app.router('permissionList', async(ctx, next) => {
    ctx.body = await permissionCollection.get().then((res) => {
      return res.data
    })
  })

  // B2 角色列表查询
  app.router('roleList', async (ctx, next) => {
    ctx.body = await authCollection.get().then((res) => {
      return res.data
    })
  })

  // C1 角色添加 及 角色对应权限更新
  app.router('authAdd', async (ctx, next) => {
    const roles = event.roles
    console.log("需要插入数据 ",roles)
    // todo 
    // 1. 先查询，

    const countResult = await authCollection.where({
      role: roles.role
    }).get()
    console.log("查询结果 ",countResult.data[0])
    // countResult.data._id
    if(countResult.data.length > 0){
      console.log("更新数据")
      // 注意这里查询的是个数组
      ctx.body = await authCollection.doc(countResult.data[0]._id).update({
        data: {
          permissions: roles.permissions
        }
      }).then((res) => {
        console.log('更新结果', res)
        return res
      })
    }else{
      console.log("新增数据")
      ctx.body = await authCollection.add({
        data: {
          ...roles,
          createTime: db.serverDate()
        }
      }).then((res) => {
        console.log('插入角色成功 ' + res)
        return res
        
      }).catch((err) => {
        console.error('插入角色失败' + err)
      })
    }
    
    
    
  })

  // 
  /**
   * A1 获取角色 及其 所有权限信息
   * role 是一个数组
   * 不传role 名称则 返回 所有角色列表及权限列表
   */
  app.router('authDetail', async (ctx, next) => {
    const role = event.role
    let w = {}
    if(role && role.length != 0){
      w = {
        role: _.in(role)
      }
    }
    ctx.body = await db.collection('role').aggregate()
      
      .match(w)
      .lookup({
        from: 'permission',
        localField: 'permissions',
        foreignField: '_id',
        as: 'permissions',
      })
      .sort({
        'permission.num': 1
      })
      .end()
      .then((res) => {
        console.log('获取角色所有信息成功' + res)
        return res
        
    }).catch((err) => {
      console.error('获取角色所有信息失败' + err)
    })
  })

  // C2 用户角色分配及 用户角色更新
  app.router('authAssign', async (ctx, next) => {
    const userRole = event.userRole

    // 1. 先查询，

    const countResult = await userRoleCollection.where({
      aid: userRole.aid
    }).get()
    console.log("查询结果 ", countResult.data[0])

    if (countResult.data.length > 0) {

      console.log("更新数据")
      // 注意这里查询的是个数组
      ctx.body = await userRoleCollection.doc(countResult.data[0]._id).update({
        data: {
          roles: userRole.roles
        }
      }).then((res) => {
        console.log('更新结果', res)
        return res 
      })
    }else{
      ctx.body = await userRoleCollection.add({
        data: {
          ...userRole,
          createTime: db.serverDate()
        }
      }).then((res) => {
        console.log('角色授权成功 ' + res)
        return res
        
      }).catch((err) => {
        console.error('角色授权失败' + err)
      })
    }

    

  })

  // A2获取用户角色信息 返回的是数组
  app.router('getUserRole', async (ctx, next) => {
    const aid = event.aid
    let w = {}
    if(aid && aid.trim() != ''){
      w = {
        aid
      }
    }
    ctx.body = await userRoleCollection.where(w).get().then((res) => {
      return res.data
    })
  })

  return app.serve()
}